class TaskQueue {
  constructor() {
    this.queue = []; // 任务队列
    this.isRunning = false; // 是否正在执行任务
  }

  /**
   * 添加任务到队列
   * @param {Function} taskFunction - 需要执行的任务函数，可以是异步函数
   * @param {number} priority - 任务的优先级，数值越大优先级越高
   * @param {number} retryCount - 任务失败后的重试次数
   */
  addTask(taskFunction, priority = 0, retryCount = 0) {
    const task = { taskFunction, priority, retryCount };
    // 根据优先级插入任务，保持队列有序
    if (this.queue.length === 0) {
      this.queue.push(task);
    } else {
      let inserted = false;
      for (let i = 0; i < this.queue.length; i++) {
        if (priority > this.queue[i].priority) {
          this.queue.splice(i, 0, task);
          inserted = true;
          break;
        }
      }
      if (!inserted) {
        this.queue.push(task);
      }
    }
    // 尝试执行下一个任务
    this.runNext();
  }

  /**
   * 执行队列中的下一个任务
   */
  async runNext() {
    // 如果已经在运行任务，或者队列为空，直接返回
    if (this.isRunning || this.queue.length === 0) {
      return;
    }

    // 标记为正在运行
    this.isRunning = true;

    // 取出队列中的第一个任务
    const currentTask = this.queue.shift();

    try {
      // 执行任务函数，支持异步
      await currentTask.taskFunction();
      console.log(`任务执行成功，优先级：${currentTask.priority}`);
    } catch (error) {
      console.error(`任务执行失败，优先级：${currentTask.priority}，错误：${error}`);

      if (currentTask.retryCount > 0) {
        console.log(`任务将重试，剩余重试次数：${currentTask.retryCount}`);
        // 减少重试次数后重新添加任务到队列
        this.addTask(currentTask.taskFunction, currentTask.priority, currentTask.retryCount - 1);
      } else {
        console.log(`任务放弃，执行下一个任务。`);
      }
    }

    // 标记为未运行
    this.isRunning = false;

    // 继续执行下一个任务
    this.runNext();
  }
}

// 示例使用

// 创建任务队列实例
const taskQueue = new TaskQueue();

// 定义一些示例任务
const task1 = async () => {
  console.log("执行任务1");
  // 模拟异步操作
  await new Promise(resolve => setTimeout(resolve, 1000));
};

const task2 = async () => {
  console.log("执行任务2");
  // 模拟失败
  throw new Error("任务2出错");
};

const task3 = async () => {
  console.log("执行任务3");
  await new Promise(resolve => setTimeout(resolve, 500));
};

// 添加任务到队列
taskQueue.addTask(task1, 1, 2); // 优先级1，最多重试2次
taskQueue.addTask(task2, 3, 1); // 优先级3，最多重试1次
taskQueue.addTask(task3, 2, 0); // 优先级2，无重试



